package EditorImagenes;

import Compilador.ErrorSintactico;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.beans.*;
import java.io.*;
import javax.imageio.ImageIO;
import proyecto1compi1.ColoresEscenario;
import proyecto1compi1.InstruccionPintar;
import proyecto1compi1.Interfaz;
import proyecto1compi1.pintarEscenario;
import proyecto1compi1.Colores;

public class Mapa extends java.awt.Panel implements Serializable {

    static int variable;
    int w = 15;
    int h = 15;
    transient Image buffer;
    Celdas gridCell[][];
String nombreImagen,extension;
String nombre;
 
public void Cambiar(int x, int y, String color){
          
            
                   Color temporal=buscarColor(color,nombre);
                    gridCell[x][y].setEditMode(Celdas.SET_START);
                    if(temporal!=null){
                    gridCell[x][y].setColor(temporal);
                    }else{
                    gridCell[x][y].setColor(Color.WHITE);
                    
                   
                    
                    }
                    gridCell[x][y].TeAmoMydelin();
            
        
   }





    public Color buscarColor(String nombreColor, String nombreescenarido) {
        Color nuevo = null;
        for (ColoresEscenario aux : Interfaz.ListaDeColoresDelEscenario) {
            if(nombreescenarido.equals(aux.nombreEscenario)){
            for (Colores aux2 : aux.ListacoloresEscnario) {
                if(nombreColor.equals(aux2.idColor)){
                    if(aux2.colorHex==null){
                    nuevo=new Color(Integer.valueOf(aux2.rojo),Integer.valueOf(aux2.verde),Integer.valueOf(aux2.azul));
                    break;
                    }else{
                    
                    
                    nuevo = Color.decode("#"+aux2.colorHex);
                    
                    
                    }
               
                
                }
                
                
            }
            
            }
        }

        return nuevo;
    }

    public void cambiardeColor(Celdas nueva, int columan, int fila, String escenario) {


        boolean encontradoX = false;
        boolean encontradoY = false;
        for (pintarEscenario aux2 : Interfaz.listadoPintarEscenario) {

            if(aux2.nombreEscenario.equals(escenario)){

            for (InstruccionPintar aux3 : aux2.listaInstrucciones) {
                encontradoX = false;
                encontradoY = false;

                if (aux3.POSX.size() == 1) {
                    for (Double d : aux3.POSX) {

                        if (d.intValue() == columan) {
                            encontradoX = true;
                        }
                        
                    }

                }else{
                       
                     if (columan<=aux3.POSX.get(0).intValue() && columan>=aux3.POSX.get(1).intValue() ) {
                            encontradoX = true;
                    }
                
                
                }
                if (aux3.POSY.size() == 1) {

                    for (Double du : aux3.POSY) {

                        if (du.intValue() == fila) {
                            encontradoY = true;
                        }

                    }
                }else{
                if (fila<=aux3.POSY.get(0).intValue() && fila>=aux3.POSY.get(1).intValue() ) {
                            encontradoY = true;
                    }
                }

                
                      if (encontradoX && encontradoY) {
                   Color temporal=buscarColor(aux3.id,escenario);
                    nueva.setEditMode(Celdas.SET_START);
                    if(temporal!=null){
                    nueva.setColor(temporal);
                    }else{
                    nueva.setColor(Color.WHITE);
                     ErrorSintactico nuevo = new ErrorSintactico();
nuevo.linea=String.valueOf(0);
nuevo.columna=String.valueOf(0);
nuevo.palabra=String.valueOf(aux3.id);
nuevo.Descripcion=String.valueOf("Error Semantico, no se encontro el color");
Interfaz.ListaDeErroresSintacticos.add(nuevo);
                    }
                    
                    nueva.TeAmoMydelin();
                }
            }
        }
        }




    }

    public Mapa(int tamano, Color color, String nombre,String nombreImagen,String extension) {
        super();
        this.nombre=nombre;
        this.nombreImagen=nombreImagen;
        this.extension=extension;
        w = tamano;
        h = tamano;
        gridCell = new Celdas[w][h];
        setLayout(new GridLayout(w, h));
        setSize(insets().left + insets().right + 430, insets().top + insets().bottom + 270);
        Celdas nueva;
        for (int i = 0; i < w; i++) {
            for (int j = 0; j < h; j++) {

                nueva = new Celdas();
                nueva.setEditMode(Celdas.SET_START);
                nueva.setColor(color);
                nueva.TeAmoMydelin();


                cambiardeColor(nueva, j, i, nombre);
                gridCell[j][i] = nueva;

                gridCell[j][i].setPosition(new Point(j, i));
                add(gridCell[j][i], "Center");
            }
        }
    }

    public void guardarImgane(String nombre, String extension) {
        try {
            File outputfile = new File(nombre+"."+extension);
            ImageIO.write((BufferedImage) buffer, extension, outputfile);
        } catch (Exception e) {
            System.out.println("oooooooooooo");
        }
    }

    public void paint(Graphics g) {
        if (buffer == null) {
            buffer = createImage(getBounds().width, getBounds().height);
        }
        Graphics bg = buffer.getGraphics();
        super.paint(bg);
        bg.setColor(Color.BLUE);
        g.drawImage(buffer, 0, 0, null);

    }

    public void update(Graphics g) {
        paint(g);
    }

    public Celdas[] getAdjacent(Celdas g) {
        Celdas next[] = new Celdas[4];
        Point p = g.getPosition();
        if (p.y != 0) {
            next[0] = gridCell[p.x][p.y - 1];
        }
        if (p.x != w - 1) {
            next[1] = gridCell[p.x + 1][p.y];
        }
        if (p.y != h - 1) {
            next[2] = gridCell[p.x][p.y + 1];
        }
        if (p.x != 0) {
            next[3] = gridCell[p.x - 1][p.y];
        }
        return next;
    }

    public Celdas getLowestAdjacent(Celdas g) {
        Celdas next[] = getAdjacent(g);
        Celdas small = next[0];
        double dist = Double.MAX_VALUE;
        for (int i = 0; i < 4; i++) {
            if (next[i] != null) {
                double nextDist = next[i].getDistFromStart();
                if (nextDist < dist && nextDist >= 0) {
                    small = next[i];
                    dist = next[i].getDistFromStart();
                }
            }
        }
        return small;
    }

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        Celdas.tidy = false;
        ois.defaultReadObject();
        Celdas.setShowPath(false);
    }
}